<?php
/**
 * Created by PhpStorm.
 * User: qiu
 * Date: 2017/4/16
 * Time: 23:40
 */
namespace app\lib;

/**
 * 数据分析引擎
 * 分析向量的元素 必须和基准向量的元素一致，取最大个数，分析向量不足元素以0填补。
 * 求出分析向量与基准向量的余弦值
 */
class VectorHelper {
    /**
     * 获得向量的模
     * @param array $array 传入分析数据的基准点的N维向量。|eg:array(1,1,1,1,1);
     */
    public static function getMarkMod($array){
        $strModDouble = 0;
        foreach($array as $val){
            $strModDouble += $val * $val;
        }
        $strMod = sqrt($strModDouble);
        //是否需要保留小数点后几位
        return $strMod;
    }

    /**
     *
     * @param array $array1 标杆向量数组
     * @param array $array2 分析向量数组
     * @param int $intLength 向量的长度
     * @return float
     */
    public static function getCosine($array1, $array2, $intLength){
        $strVector = 0;
        for($i = 0; $i < $intLength; $i++){
            $strMarkVal = isset($array1[$i]) ? $array1[$i] : 0;
            $strAnalyVal = isset($array2[$i]) ? $array2[$i] : 0;
            $strVector += $strMarkVal * $strAnalyVal;
        }
        $array1Mod = self::getMarkMod($array1);
        $array2Mod = self::getMarkMod($array2);
        if($array1Mod == 0 || $array2Mod == 0) {
            return 0;
        }
        $cosine = $strVector / $array1Mod / $array2Mod;
        return $cosine;
    }
}